package com.gonsin.gview.logic.parser;

import com.gonsin.gview.annotations.GContext;
import com.gonsin.gview.annotations.model.ViewRequest;
import com.gonsin.gview.model.GViewModel;
import com.gonsin.gview.model.IViewModelHolder;
import com.gonsin.gview.model.IViewPermissionHandler;
import com.gonsin.gview.model.dynamic.DynamicView;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 使用桥接模式，将DynamicView和GViewModel实时进行连接
 *
 * 这个是动态生成的gview，通过不同的请求，生成不同的view内容
 */
public class DynamicModelHolder implements IViewModelHolder {

    /**
     * 通过DynamicView 接口，，创建动态页面类
     */
    private DynamicView dynamicView;

    /**
     * 将 DynamicView 接口动态创建 成 ViewModel的工具
     */
    private DynamicViewParser parser;

    /**
     * 动态页面的名字
     */
    private String viewName;

    /**
     * 该页面的数据源
     * 由于每个页面都是动态创建，dataId需要在该页面中自行管理
     */
    private AtomicInteger dataId = new AtomicInteger(0);

    /**
     * 该页面的数据源
     * 由于每个页面都是动态创建，buttonId需要在该页面中自行管理
     */
    private AtomicInteger buttonId = new AtomicInteger(0);


    /**
     * 该页面曾经产生过的数据模板
     * key = index
     * value = GDataModel 、GListDataModel 、 GTableDataModel 、 等等
     */
    private Map<Integer, Object> dataModelMap = new HashMap<>();


    public DynamicModelHolder(String viewName, DynamicView dynamicView, DynamicViewParser parser) {
        this.dynamicView = dynamicView;
        this.viewName = viewName;
        this.parser = parser;
    }

    @Override
    public GViewModel getViewModel(ViewRequest request, IViewPermissionHandler permissionHandler) {
        GContext context = new GContext(request.getViewName(), request.getRequest(), request.getResponse(), request.getProps(), false);

        // 每次请求都会创建新的模板
        GViewModel model = parser.parse(context, dynamicView);

        // 动态生成的页面，不需要翻译
        return model;
    }

    @Override
    public String getViewName() {
        return viewName;
    }

    @Override
    public List<String> getProps() {
        return dynamicView.props();
    }

//    @Override
//    public <T> T getDataModel(int index, Class<T> dataModelClass) {
//        return (T) dataModelMap.get(index);
//    }
//
//    @Override
//    public void putDataModel(int index, Object dataModel) {
//        dataModelMap.put(index, dataModel);
//    }
}
